/* eslint-env node */

import fs from 'node:fs';
import path from 'node:path';
import type webpack from 'webpack';

type Options = {
  basePath: string;
};

class LastBuiltPlugin {
  basePath: string;
  isWatchMode: boolean;

  constructor({basePath}: Options) {
    this.basePath = basePath;
    this.isWatchMode = false;
  }

  apply(compiler: webpack.Compiler) {
    compiler.hooks.watchRun.tapAsync('LastBuiltPlugin', (_, callback) => {
      this.isWatchMode = true;
      callback();
    });

    compiler.hooks.done.tapAsync('LastBuiltPlugin', (_, callback) => {
      // If this is in watch mode, then assets will *NOT* be written to disk
      // We only want to record when we write to disk since this plugin is for
      // our acceptance test (which require assets to be on fs)
      if (this.isWatchMode) {
        callback();
        return;
      }

      fs.writeFile(
        path.join(this.basePath, '.webpack.meta'),
        JSON.stringify({
          // in seconds
          built: Math.floor(new Date(new Date().toUTCString()).getTime() / 1000),
        }),
        callback
      );
    });
  }
}

export default LastBuiltPlugin;
